package com.tensquare.friend.service;
/*
 *ClassName:FriendService
 *Description:交友模块的逻辑服务层
 *@author:可爱的大鸭子
 */

import com.netflix.discovery.converters.Auto;
import com.tensquare.friend.client.GatheringClient;
import com.tensquare.friend.client.LabelClient;
import com.tensquare.friend.client.NoticeClient;
import com.tensquare.friend.client.UserClient;
import com.tensquare.friend.dao.FriendDao;
import com.tensquare.friend.dao.NoFriendDao;
import com.tensquare.friend.dao.UserDao;
import com.tensquare.friend.pojo.Friend;
import com.tensquare.friend.pojo.Gath;
import com.tensquare.friend.pojo.NoFriend;
import com.tensquare.notice.pojo.Notice;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DecimalFormat;
import java.util.*;

@Service
public class FriendService {
    @Autowired
    private FriendDao friendDao;
    @Autowired
    private NoFriendDao noFriendDao;
    @Autowired
    private UserClient userClient;
    @Autowired
    private NoticeClient noticeClient;
    @Autowired
    private LabelClient labelClient;
    @Autowired
    private GatheringClient gatheringClient;
    @Autowired
    private UserDao userDao;
    @Autowired
    private RabbitTemplate rabbitTemplate;


    /**
     * 添加好友（喜欢某人返回1,取消喜欢某人返回0）
     * @param userid
     * @param friendid
     * @return
     */
    @Transactional
    public int addFriend(String userid,String friendid,String type){
        if(type.equals("0")){
            return 0;
        }

        //判断如果用户已经喜欢了这个人，则取消喜欢，只是删除喜欢表的单向喜欢数据
        if(friendDao.selectCount(userid, friendid)>0){
            deleteFriend(userid,friendid);
            return 0;
        }
        //向喜欢表中添加记录
        Friend friend=new Friend();
        friend.setUserid(userid);
        friend.setFriendid(friendid);
        friend.setIslike("0");
        friendDao.save(friend);

        //发送喜欢的消息通知，点对点消息，先存到数据库中
        Notice notice = new Notice();
        notice.setReceiverId(friendid);
        notice.setOperatorId(userid);
        notice.setAction("love");
        notice.setTargetType("gath");
        notice.setTargetId(userid);   //约会的id，也就是用户的id
        notice.setCreatetime(new Date());
        notice.setType("user");		//点对点的通知类型
        notice.setState("0");
        noticeClient.add(notice);	//保存通知消息

        //1 创建Rabbit管理器
        RabbitAdmin rabbitAdmin = new RabbitAdmin(rabbitTemplate.getConnectionFactory());
        //2 创建队列，每个用户都有自己的队列，通过用户id进行区分
        Queue queue = new Queue("gath_love_" + friendid, true);

        rabbitAdmin.declareQueue(queue);
        //3 发送消息，设置路由键和消息
        rabbitTemplate.convertAndSend("gath_love_"+friendid,friendid);

        //判断对方是否已经喜欢了你，如果是就更新为互相喜欢，表示双方成为好友
        if(friendDao.selectCount(friendid,userid)>0){
            friendDao.updateLike(userid,friendid,"1");
            friendDao.updateLike(friendid,userid,"1");
        }

        return 1;
    }

    /**
     * 不给我推荐某人
     * @param userid
     * @param friendid
     */
    @Transactional
    public void addNoFriend(String userid,String friendid){
        NoFriend noFriend=new NoFriend();
        noFriend.setUserid(userid);
        noFriend.setFriendid(friendid);
        noFriendDao.save(noFriend);
    }

    /**
     * 删除喜欢表的好友，单向取消喜欢
     * @param userid
     * @param friendid
     */
    @Transactional
    public void deleteFriend(String userid,String friendid){
        friendDao.deleteFriend(userid,friendid);
    }

    //查询我的喜欢人数和被喜欢人数
    public Map<String,Integer> getMyLove(String id) {
        int myLove=friendDao.getMyLove(id);
        int loveMe=friendDao.getLoveMe(id);
        Map<String ,Integer> map=new HashMap<>();
        map.put("myLove",myLove);
        map.put("loveMe",loveMe) ;
        return map;
    }

    //查询我的好友列表
    public List<String> findMyFriends(String userId) {
        return friendDao.findMyFriends(userId);
    }

    //计算我和别人的匹配度，根据标签列表和报名的活动来计算
    public Double getSuitability(String me,String other){
        //1.返回我和他的关注的标签列表
        List my_labels=(List)labelClient.getMyLabels(me).getData();
        List other_labels=(List)labelClient.getMyLabels(other).getData();
        //System.out.println("labels:"+my_labels+":"+other_labels);
        String p1=func(my_labels,other_labels);
        //2.返回我和他的报名的活动列表
        List my_gatherings=(List)gatheringClient.getMyGatherings(me).getData();
        List other_gatherings=(List)gatheringClient.getMyGatherings(other).getData();
        //System.out.println("gatherings:"+my_gatherings+":"+other_gatherings);
        String p2=func(my_gatherings,other_gatherings);

        double d1=Double.valueOf(p1.toString());
        double d2=Double.valueOf(p2.toString());
        return d1*0.7+d2*0.3;
    }

    //相似度算法
    public static String func(List l1,List l2){
        if(l1.size()==0||l2.size()==0) return 0+"";
        double res;
        int count=0;
        for(int i=0;i<l1.size();i++){
            for(int j=0;j<l2.size();j++){
                if(l1.get(i).equals(l2.get(j))){
                    count++;
                }
            }
        }
        int num1=count;
        int num2=l1.size()+l2.size()-num1;
        res=(double)num1/num2*100.0;
        DecimalFormat df = new DecimalFormat("#.00");
        return df.format(res);
    }

    //返回共同关注的列表
    public List<String> getCommenList(List l1,List l2){
        HashSet set1 = new HashSet();
        for (int i=0;i<l1.size();i++) set1.add(l1.get(i));
        HashSet set2 = new HashSet();
        for (int i=0;i<l2.size();i++) set2.add(l2.get(i));

        set1.retainAll(set2);   //交集 操作

        List<String> res=new ArrayList<>();
        for (Object s : set1) res.add((String)s);
        return res;
    }

}
